import { createStore } from 'redux';


/*
reducer 是个形式为 (state, action)=>state 的纯函数， 描述了 action 如何把 state 转变成下一个 state 。

Reducer就是这样的函数，永远不要在reducer里做这些操作：
修改传入的参数。
执行有副作用（Side effects）的操作，如API请求和路由跳转。
调用非纯函数，如Date.now()或Math.random()。
*/

// reducer纯函数
function counter(state = 0, action) {
  console.log('->counter: ' + action.type);

  switch (action.type) {
    case 'INCREMENT':
      return state + 1;
    case 'DECREMENT':
      return state - 1;
    default:
      return state;
  }
}
/**
 * 使用这个reducer纯函数代替上面的函数，会发现：
 * 当state为对象时，如果在reducer中修改state，
 * 将会导致新旧state指向一个地址
 */
// function counter(state = { val: 0 }, action) {
//   switch (action.type) {
//     case 'INCREMENT':
//     state.val++;
//       return state;
//     case 'DECREMENT':
//     state.val--;
//       return state;
//     default:
//       return state;
//   }
// }


console.log('=>createStore(counter) 创建store');
//参数1: reducer函数
//参数2: 初始 state, 不传默认undfined
const store = createStore(counter, 100);

console.log('=>store.getState');
let currentValue = store.getState();

const listener = () => {
  const previousValue = currentValue;
  console.log('listener->getState 1');
  currentValue = store.getState();
  console.log('listener->getState 2');
  console.log('pre state:', previousValue, 'next state:', currentValue);
};

console.log('=>store.subscribe 订阅state改变通知');
store.subscribe(listener);

//改变内部state唯一方法是dispatch一个action。

console.log('=>store.dispatch INCREMENT');
store.dispatch({ type: 'INCREMENT' });

console.log('=>store.dispatch INCREMENT_');
store.dispatch({ type: 'INCREMENT_' });

console.log('store.dispatch DECREMENT');
store.dispatch({ type: 'DECREMENT' });
